#include <p18F452.h>
#include <usart.h>
#include <timers.h>
#include <xlcd.h>
#include <stdlib.h>
#include <delays.h>
#include <adc.h>
#include <pwm.h>
#include "delay.h"
#include "config.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void INT_ADC (void);
void INT_LCD (void);
void PWM (void);
int conversion (void );
void retardo1 (void);
void retardo2 (void);
void Compara (void);
void ANG (void);
void pwm(int pm);
void clareado (void);
void manual (void);
void IZQ (void);
void DER (void);
void MAN (void);
void ANGULOS(int ANG1, int ANG2);
struct {int T[2];}Opr[1];
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void INT_PUER (void)
{
		TRISA  = 0b00000001;							 	//CONFIGURACION PARA ENTRADAS ANALOGICAS
		TRISE  = 7;							 	//CONFIGURACION PARA ENTRADAS ANALOGICAS
		TRISC  = 0;								//RC2/CCP1 salida PWM
		TRISD  = 31;							//
return;
}

//*****************************************************CONFIGURACION ADC*****************************************************
void INT_ADC (void)
{
		ADCON0 = 0X81;							//PRESCALER DE 64 AL INICIO DE LA CONVERSION
		ADCON1 = 0XCE;	//64 192			 	//LOS BITS MAS SIGNIFICATIVOS ESTAN EN ADRESH  RIGHT DERECHA LEFT HIZQUIERDA (192 LOS MAS SIGNIFICATIVOS ESTAN EN ADRESH) C0(192) 
return;
}
//*****************************************************CONFIGURACION DE LA LCD************************************************
void INT_LCD (void)
{
	OpenXLCD( FOUR_BIT & LINES_5X7 ); 			//CONFIGURACION DE LA LCD PARA CUATRO LINEAS
	WriteCmdXLCD( CURSOR_OFF );
	WriteCmdXLCD( BLINK_OFF );
return;
}
//******************************************************PWM***************************************************************************//
void PWM (void)
{
	PR2		=	255;	//Periodo de 4ms
	CCP1CON	=	15;		//Modo PWM
	T2CON	=	7;		//Habilitacion del TMR2 con predivisor de 16
return;
}
//****************************************************CONVERSION****************************************************
int conversion (void )
{
	unsigned int ADC = 0;
	ADCON0 = 0x85;
	while (ADCON0 ==0x85)  						//SE COMPARA MIENTRAS NO TERMINE LA CONVERSION NO SE PROSIGUE
	continue;
	ADC = ReadADC()&1023;						//RECIBO EL VALOR DE LA CONVERSION Y APLICO UN FILTRO CON UNA COMPUERTA AND
	return ADC;
}
//129,137,145,153,161,169,177,185
//****************************************************RETARDO DE 10**********************************************************//
void retardo1 (void)
{
Delay10KTCYx (10);
return;
}
//****************************************************RETARDO DE 20**********************************************************//
void retardo2 (void)
{
Delay10KTCYx (20);
return;
}
////****************************************************COMPARA****************************************************
void Compara (void)
{
char Angulo=0;
Opr[0].T[0]=0;
Opr[0].T[1]=0;
	Angulo = PORTD & 31;
	switch (Angulo)
	{
		case 0b00000000: Opr[0].T[0] = 0;	Opr[0].T[1] = 12;	goto vali; 		//1
		case 0b00000001: Opr[0].T[0] = 12;	Opr[0].T[1] = 23;	goto vali;		//2
		case 0b00000010: Opr[0].T[0] = 34;	Opr[0].T[1] = 47;	goto vali;		//3
		case 0b00000011: Opr[0].T[0] = 23;	Opr[0].T[1] = 34;	goto vali;		//4
		case 0b00000100: Opr[0].T[0] = 79;	Opr[0].T[1] = 90;	goto vali;		//5
		case 0b00000101: Opr[0].T[0] = 67;	Opr[0].T[1] = 79;	goto vali;		//6
		case 0b00000110: Opr[0].T[0] = 45;	Opr[0].T[1] = 56;	goto vali;		//7
		case 0b00000111: Opr[0].T[0] = 56;	Opr[0].T[1] = 67;	goto vali;		//8
		case 0b00001000: Opr[0].T[0] = 169;	Opr[0].T[1] = 180;	goto vali;		//9
		case 0b00001001: Opr[0].T[0] = 158;	Opr[0].T[1] = 169;	goto vali;		//10
		case 0b00001010: Opr[0].T[0] = 136;	Opr[0].T[1] = 147;	goto vali;		//11
		case 0b00001011: Opr[0].T[0] = 147;	Opr[0].T[1] = 158;	goto vali;		//12
		case 0b00001100: Opr[0].T[0] = 90;	Opr[0].T[1] = 102;	goto vali;		//13
		case 0b00001101: Opr[0].T[0] = 102;	Opr[0].T[1] = 114;	goto vali;		//14
		case 0b00001110: Opr[0].T[0] = 125;	Opr[0].T[1] = 136;	goto vali;		//15
		case 0b00001111: Opr[0].T[0] = 114;	Opr[0].T[1] = 125;	goto vali;		//16
		case 0b00010000: Opr[0].T[0] = 349;	Opr[0].T[1] = 360;	goto vali;		//17 
		case 0b00010001: Opr[0].T[0] = 338;	Opr[0].T[1] = 349;	goto vali;		//18
		case 0b00010010: Opr[0].T[0] = 315;	Opr[0].T[1] = 326;	goto vali;		//19
		case 0b00010011: Opr[0].T[0] = 326;	Opr[0].T[1] = 338;	goto vali;		//20
		case 0b00010100: Opr[0].T[0] = 270;	Opr[0].T[1] = 282;	goto vali;		//21
		case 0b00010101: Opr[0].T[0] = 282;	Opr[0].T[1] = 293;	goto vali;		//22
		case 0b00010110: Opr[0].T[0] = 306;	Opr[0].T[1] = 315;	goto vali;		//23
		case 0b00010111: Opr[0].T[0] = 293;	Opr[0].T[1] = 306;	goto vali;		//24
		case 0b00011000: Opr[0].T[0] = 180;	Opr[0].T[1] = 192;	goto vali;		//25
		case 0b00011001: Opr[0].T[0] = 192;	Opr[0].T[1] = 203;	goto vali;		//26
		case 0b00011010: Opr[0].T[0] = 214;	Opr[0].T[1] = 225;	goto vali;		//27
		case 0b00011011: Opr[0].T[0] = 203;	Opr[0].T[1] = 214;	goto vali;		//28
		case 0b00011100: Opr[0].T[0] = 259;	Opr[0].T[1] = 270;	goto vali;		//29
		case 0b00011101: Opr[0].T[0] = 247;	Opr[0].T[1] = 259;	goto vali;		//30
		case 0b00011110: Opr[0].T[0] = 225;	Opr[0].T[1] = 236;	goto vali;		//31
		case 0b00011111: Opr[0].T[0] = 236;	Opr[0].T[1] = 247;	goto vali;		//32
	}
vali:
ANG();	
return;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ANG (void)
{
int DTA1,DTA2;	
	DTA1=Opr[0].T[0];
	DTA2=Opr[0].T[1];		
	ANGULOS(DTA1,DTA2);	
return;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void pwm(int pm)
{
	SetDCPWM1(pm);
return;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void clareado (void)
{
		SetDDRamAddr(0x80);
		putrsXLCD("                    ");
return;
}
//******************NUMERO ENTERO DE DOS DIGITOS*************************//
void ANGULOS(int ANG1, int ANG2)
{
	char buffer[3]={0,0,0},buffer1[3]={0,0,0};
	clareado();
	ultoa(ANG1,buffer);
	SetDDRamAddr(0x83);
	while( BusyXLCD());
	WriteDataXLCD(buffer[0]);
	WriteDataXLCD(buffer[1]);
	WriteDataXLCD(buffer[2]);
	SetDDRamAddr( 0x87 );
	putrsXLCD("<->");
	ultoa(ANG2,buffer1);
	SetDDRamAddr(0x8B);
	while( BusyXLCD());
	WriteDataXLCD(buffer1[0]);
	WriteDataXLCD(buffer1[1]);
	WriteDataXLCD(buffer1[2]);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
retardo2();
return;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void IZQ (void)
{
		SetDDRamAddr( 0xc0 );
		putrsXLCD("   S IZQUIERDO      ");
retardo1();
return;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DER (void)
{
		SetDDRamAddr( 0xc0 );
		putrsXLCD("    S DERECHO        ");
retardo1();
return;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void MAN (void)
{
		SetDDRamAddr( 0x80 );
		putrsXLCD("     APAGADO       ");
		SetDDRamAddr( 0xc0 );
		putrsXLCD("                   ");
retardo1();
return;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void manual (void)
{
int z=0;
			z = conversion();					//SE LLAMA A LA FUNCION DE CONVERSION DEL CANAL A0
///////////////////////////////////////////////////////////////////////////
			while(PORTEbits.RE0 == 0)	 		//SE VERFICA EL PIN DE ENTRADA
			{
				MAN();
				pwm(0);	
			}
////////////////////////////////////////////////////////////////////////////
			if(PORTEbits.RE1 == 0)	 			//SE VERIFICA EL PIN DE ENTRADA
			{
				z = conversion();
				pwm(z);
				PORTAbits.RA2= 0;
				PORTAbits.RA1= 1;
				Compara();
				DER();
			}			
////////////////////////////////////////////////////////////////////////////
			if(PORTEbits.RE1 == 1)	 			//SE VERIFICA EL PIN DE ENTRADA
			{
				z = conversion();
				pwm(z);
				PORTAbits.RA1= 0;
				PORTAbits.RA2= 1;
				Compara();
				IZQ();
				
			}
///////////////////////////////////////////////////////////////////////////	

return;
}
